home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / vol16n12.zip / IPC.ZIP / PCLIENT.ZIP / PCLIDLG.CPP next >
C/C++ Source or Header  |  1997-02-13  |  5KB  |  192 lines

  1. // PCliDlg.cpp : implementation file
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "PClient.h"
  6. #include "PCliDlg.h"
  7.  
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13.  
  14. /////////////////////////////////////////////////////////////////////////////
  15. // CPClientDlg dialog
  16.  
  17. CPClientDlg::CPClientDlg(CWnd* pParent /*=NULL*/)
  18.     : CDialog(CPClientDlg::IDD, pParent)
  19. {
  20.     //{{AFX_DATA_INIT(CPClientDlg)
  21.     //}}AFX_DATA_INIT
  22.     m_hIcon = AfxGetApp()->LoadStandardIcon(IDI_WINLOGO);
  23.     m_hPipe = NULL;
  24. }
  25.  
  26. void CPClientDlg::DoDataExchange(CDataExchange* pDX)
  27. {
  28.     CDialog::DoDataExchange(pDX);
  29.     //{{AFX_DATA_MAP(CPClientDlg)
  30.     DDX_Control(pDX, IDC_SERVER, m_wndServerName);
  31.     DDX_Control(pDX, IDC_CONNECT, m_wndButton);
  32.     DDX_Control(pDX, IDC_PROGRESS, m_wndProgress);
  33.     //}}AFX_DATA_MAP
  34. }
  35.  
  36. BEGIN_MESSAGE_MAP(CPClientDlg, CDialog)
  37.     //{{AFX_MSG_MAP(CPClientDlg)
  38.     ON_WM_PAINT()
  39.     ON_WM_QUERYDRAGICON()
  40.     ON_EN_CHANGE(IDC_SERVER, OnChangeServerName)
  41.     ON_BN_CLICKED(IDC_CONNECT, OnConnect)
  42.     ON_WM_CLOSE()
  43.     //}}AFX_MSG_MAP
  44.     ON_MESSAGE (WM_USER_UPDATE, OnUserUpdate)
  45.     ON_MESSAGE (WM_USER_CONNECTION_LOST, OnUserConnectionLost)
  46.     ON_BN_CLICKED (IDOK, OnConnect)
  47. END_MESSAGE_MAP()
  48.  
  49. /////////////////////////////////////////////////////////////////////////////
  50. // CPClientDlg message handlers
  51.  
  52. BOOL CPClientDlg::OnInitDialog()
  53. {
  54.     CDialog::OnInitDialog();
  55.  
  56.     SetIcon(m_hIcon, TRUE);            // Set big icon
  57.     SetIcon(m_hIcon, FALSE);        // Set small icon
  58.     
  59.     m_wndProgress.SetRange (0, 10);
  60.     m_wndProgress.SetPos (0);
  61.     
  62.     return TRUE;
  63. }
  64.  
  65. void CPClientDlg::OnPaint() 
  66. {
  67.     if (IsIconic())
  68.     {
  69.         CPaintDC dc(this);
  70.  
  71.         SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  72.  
  73.         // Center icon in client rectangle
  74.         int cxIcon = GetSystemMetrics(SM_CXICON);
  75.         int cyIcon = GetSystemMetrics(SM_CYICON);
  76.         CRect rect;
  77.         GetClientRect(&rect);
  78.         int x = (rect.Width() - cxIcon + 1) / 2;
  79.         int y = (rect.Height() - cyIcon + 1) / 2;
  80.  
  81.         // Draw the icon
  82.         dc.DrawIcon(x, y, m_hIcon);
  83.     }
  84.     else
  85.     {
  86.         CDialog::OnPaint();
  87.     }
  88. }
  89.  
  90. HCURSOR CPClientDlg::OnQueryDragIcon()
  91. {
  92.     return (HCURSOR) m_hIcon;
  93. }
  94.  
  95. void CPClientDlg::OnChangeServerName() 
  96. {
  97.     CString string;
  98.     m_wndServerName.GetWindowText (string);
  99.     m_wndButton.EnableWindow (string.GetLength ());
  100. }
  101.  
  102. void CPClientDlg::OnConnect() 
  103. {
  104.     //
  105.     // Connect to the named pipe server.
  106.     //
  107.     CString strServerName;
  108.     m_wndServerName.GetWindowText (strServerName);
  109.     CString string = "\\\\" + strServerName + "\\pipe\\ipcdemo";
  110.  
  111.     m_hPipe = ::CreateFile (string, GENERIC_READ, FILE_SHARE_READ,
  112.         NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  113.  
  114.     if (m_hPipe == INVALID_HANDLE_VALUE) {
  115.         CString strErrMsg = "Unable to open " + string + ". " \
  116.             "Make sure the Pipe Server application is running on " \
  117.             "server " + strServerName + " and try again.";
  118.         MessageBox (strErrMsg, "Error", MB_OK | MB_ICONEXCLAMATION);
  119.         return;
  120.     }
  121.  
  122.     //
  123.     // Disable further input to the edit control and Connect button.
  124.     //
  125.     m_wndServerName.EnableWindow (FALSE);
  126.     m_wndButton.EnableWindow (FALSE);
  127.  
  128.     //
  129.     // Start a background thread to read input from the pipe.
  130.     //
  131.     PIPEINFO* pInfo = new PIPEINFO;
  132.     pInfo->hPipe = m_hPipe;
  133.     pInfo->hWnd = m_hWnd;
  134.  
  135.     AfxBeginThread (ThreadFunc, (LPVOID) pInfo);
  136. }
  137.  
  138. LONG CPClientDlg::OnUserUpdate (UINT wParam, LONG lParam)
  139. {
  140.     //
  141.     // Update the progress control.
  142.     //
  143.     m_wndProgress.SetPos (wParam);
  144.     return 0;
  145. }
  146.  
  147. LONG CPClientDlg::OnUserConnectionLost (UINT wParam, LONG lParam)
  148. {
  149.     //
  150.     // Close the pipe handle and update the display when the connection
  151.     // is lost.
  152.     //
  153.     m_wndServerName.EnableWindow ();
  154.     m_wndButton.EnableWindow ();
  155.     m_wndProgress.SetPos (0);
  156.     ::CloseHandle (m_hPipe);
  157.     m_hPipe = NULL;
  158.     return 0;
  159. }
  160.  
  161. void CPClientDlg::OnClose() 
  162. {
  163.     //
  164.     // Close the pipe handle before shutting down.
  165.     //
  166.     if ((m_hPipe != NULL) && (m_hPipe != INVALID_HANDLE_VALUE)) {
  167.         ::CloseHandle (m_hPipe);
  168.         m_hPipe = NULL;
  169.     }    
  170.     CDialog::OnClose();
  171. }
  172.  
  173. /////////////////////////////////////////////////////////////////////////////
  174. // Thread function
  175.  
  176. UINT ThreadFunc (LPVOID pParam)
  177. {
  178.     PIPEINFO* pInfo = (PIPEINFO*) pParam;
  179.     HANDLE hPipe = pInfo->hPipe;
  180.     HWND hWnd = pInfo->hWnd;
  181.     delete pInfo;
  182.  
  183.     BYTE byte;
  184.     DWORD dwBytesRead = 999;
  185.  
  186.     while (dwBytesRead && ::ReadFile (hPipe, &byte, 1, &dwBytesRead, NULL))
  187.         ::PostMessage (hWnd, WM_USER_UPDATE, (WPARAM) byte, 0);
  188.  
  189.     ::PostMessage (hWnd, WM_USER_CONNECTION_LOST, 0, 0);
  190.     return 0;
  191. }
  192.